<?php namespace common\helps;
/**
 * 自定义的全局的公共的方法
 * @author Administrator
 *
 */
class Tools{
    /**
     * 新建文件夹，实现级联创建文件夹
     * @param unknown $dir
     * @param number $mode
     * @return boolean
     */
    public static function mkdirs($dir, $mode = 0777)
    {
        if (is_dir($dir) || @mkdir($dir, $mode)) return

            true;
        if (!Tools::mkdirs(dirname($dir), $mode)) return

            false;

        return @mkdir($dir, $mode);
    }

    /**
     * 根据月日分计算并创建目录
     * @return string
     */
    public static function mk_dir_bytime(){
        $dir = date('y/md', time());
        if(is_dir('./' .$dir)){
            return $dir;
        }else{
            mkdir('./'.$dir,0777,true);
            return $dir;
        }
    }

    /**
     * 随机生成移动后的文件名
     */
    public static function randName() {
        $str = 'abcdefghijkmnpqrstwxyz23456789';
        return substr(str_shuffle($str),0,6);
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function getBytes($string) {
        $bytes = array();
        for($i = 0; $i < strlen($string); $i++){
            $bytes[] = ord($string[$i]);
        }
        return $bytes;
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function getArrays($string) {
        $bytes = array();
        for($i = 0; $i < strlen($string); $i++){
            $bytes[] = $string[$i];
        }
        return $bytes;
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function setByteToString($audioData) {
        $str = "";
        for($i = 0; $i < strlen($audioData); $i++){
            $str  .= ord($audioData[$i]);
        }
        return $str;
    }

    /*
     * 等同于javaScript中的 new Date().toUTCString();
     */
    public static function toGMTString($time) {
        return gmdate("D, d M Y H:i:s", $time).' GMT';
    }

    /**
     * 返回16位md5值
     *
     * @param string $str 字符串
     * @return string $str 返回16位的字符串
     */
    public static function shortMd5($str) {
        return substr(md5($str), 8, 16);
    }

    /**
     * 拿到文件的路径 linux
     *
     * @param string $str 字符串
     * @return string $str 返回16位的字符串
     */
    public static function getFilePath($str) {
        $arr = explode(":",$str);
        $res0 = '';
        if(!empty($arr)){
            $res0 = $arr['1'];
        }

        $res0 = str_replace("\\","/","/uploads".$res0);

        return $res0;
    }

    public static function getUrlFilePath($res){
        $res = str_replace("/uploads/RecordFile/",  "http://192.168.2.118/RecordFile_d/",$res);
        return $res;
    }

    /**
     * 拿到文件的路径 windows
     *
     * @param string $str 字符串
     * @return string $str 返回16位的字符串
     */
    public static function getFilePathWindows($str) {
        $res = str_replace("\\","/",$str);
        $res = Tools::getFilePath($res);
        $command = "java -jar ./asr/windows/Wav2Wav.jar ".$str." ".$res;
        exec($command);
        return $res;
    }

    /**
     * 生成唯一的订单号
     */
    public static function build_oreder_one(){
        return date('Ymd').substr(implode(null,array_map

            ('ord',str_split(substr(uniqid(),7,13),1))),0,8);
    }


    /**
     * 拿到百度的识别的数据然后进行解析
     * @param $array
     * @param $linshi
     * @param $shibie
     */
    public static function baiduresultToArray($str){
        $shibie = [];
        $array = explode("结果：",$str);
        for ($i = 0;$i<count($array);$i++){
            if( (mb_substr($array[$i],-3)===":识别"
                    || mb_substr($array[$i],-4)==="语意理解")
                && $i+1<count($array)){//为有识别的结果，就是这个的下一个
                $first = strpos($array[$i+1],"{");
                $last = strrpos($array[$i+1],"}");
                if($first!==false && $last!==false){
                    $shibie[] = substr($array[$i+1],$first,$last

                        +1-$first);
                }
            }
        }
        return $shibie;
    }

    /**
     * 拿到阿里云的识别的数据然后进行解析
     * @param $array
     * @param $linshi
     * @param $shibie
     */
    public static function aliyunresultToArray($str){
        $shibie = [];
        $array = explode("response json is: ",$str);
        for ($i = 2;$i<count($array)-1;$i++){
//            $first = strpos($array[$i+1],"{");

            $first = strrpos($array[$i],"{");
            $last = strrpos($array[$i],"}");
            if($first!==false && $last!==false){
                $temp = substr($array[$i],$first,$last+1-$first);
                $temp = str_replace("\n",",",$temp);
                $tempJson = json_decode($temp);
                $text = $tempJson->text;
                //对拿到的数据进行解析词法分析，然后存储到数据库
                if($tempJson->status_code==0){//表示一句话完成，就存到数据库里
                    require_once './asr/aip/AipNlp.php';
                    $app_id = '11318672';
                    $api_key = 'spxbydPhMFpTnTpKaEYUK8V8';
                    $secret_key = 'ybO0e25b2FRdhdq93O8g10mgD1hWCZig';
                    $client = new \AipNlp($app_id, $api_key, $secret_key);
                    $yyresult = $client->lexer($text);//语义分析的结果
                    try{
                        $items = $yyresult['items'];
                        $itemsStr = "";
                        foreach ($items as $k=>$v){
                            $itemsStr .= $v['item']."  ";
                        }
                        $tempJson->text = $itemsStr;
                    }catch(\Exception $e){
                    }
                    $temp = json_encode($tempJson);
                    $shibie[] = $temp;
                }
            }
        }
        return $shibie;
    }

    public static function check_utf8($str)
    {
        $len = strlen($str);
        for($i = 0; $i < $len; $i++){
            $c = ord($str[$i]);
            if ($c > 128) {
                if (($c > 247)) return false;
                elseif ($c > 239) $bytes = 4;
                elseif ($c > 223) $bytes = 3;
                elseif ($c > 191) $bytes = 2;
                else return false;
                if (($i + $bytes) > $len) return false;
                while ($bytes > 1) {
                    $i++;
                    $b = ord($str[$i]);
                    if ($b < 128 || $b > 191) return false;
                    $bytes--;
                }
            }
        }
        return true;
    }

    /**
     * @param $array
     * @param $linshi
     * @param $shibie
     */
    public static function baiduresultToResArray($out){
        $shibie = [];
        foreach ($out as $k=>$v){
            if(strrpos($v,"识别结果：")!==false){//为识别结果
                $first = strpos($v,"{");
                $last = strrpos($v,"}");
                if($first!==false && $last!==false){
                    $shibie[] = substr($v,$first,$last+1-$first);
                }
            }
        }
        return $shibie;
    }

    /**
     * 拿到百度的数据然后存入数据库里面
     * @param $arr
     */
    public static function baiduSaveToSql($arr){
        $res = '';
        if(count($arr)>=1){
            foreach ($arr as $k=>$v){
                $tempres = json_decode($v);
                $res .= $tempres->results_recognition[0].".";
            }
        }
        return $res;
    }

    /**
     * 把数据库里面的识别结果json解析成相应的数据库,传入的必须是
    json格式的字符串
     * @param $arr
     */
    public static function jsonArrayToHtml($json){
        $jsonArray = json_decode($json);
        $resArray = [];
        for($i=0;$i<count($jsonArray);$i++){
            $tempRes = json_decode($jsonArray[$i]);
            if(isset($tempRes->results_recognition)){
                $resArray[] = $tempRes->results_recognition;
            }elseif(isset($tempRes->text)){
                $resArray[] = $tempRes->text;
            }
        }
        return $resArray;
    }

    //这个函数接收的都是路径，所以判断了文件扩展名
    public static function shell2txt($a){
        $ary = explode('/', $a);
        foreach($ary as $k => $v){
            if(strpos($v, '?\\') !== false){
                $_ary = explode('?\\', $v);

                foreach($_ary as $_k=>$_v){
                    if($_v == '') continue;
                    //判断是否有文件扩展名
                    $end = '';
                    if(strpos($_v, '.') !== false){
                        $end = substr($_v, strpos($_v, '.'));
                    }
                    $_ary[$_k] = dechex($_v).$end;
                }

                $ary[$k] = implode('%', $_ary);
            }
        }

        $a = implode('/', $ary);
        return  urldecode($a);
    }

    /**
     * 把数据库里面的识别结果json解析成相应的数据库,传入的必须是

    json格式的字符串
     * @param $arc_problems_arr 需要过滤的话语的数组
     * @param $arc_language 数据库拿到的识别的话语，json字符串
     * @return array 是将结果解析后的，带有骂人的话语被标识为红色
     */
    public static function recogniseBaiduToHtml($arc_problems_arr,$arc_language){
        foreach ($arc_problems_arr as $k2 => $v2) {
            $arc_problems_arr_replace[] = '<a style="color: red">' . $v2 . '</a>';
        }
        $arc_language_html = \common\helps\Tools::jsonArrayToHtml($arc_language);
        $arc_language_html_res = [];
        foreach ($arc_language_html as $k1 => $v1) {
            $temp = [];
            if(is_array($v1)){
                foreach ($v1 as $v1_k=>$v1_v){
                    $temp[] = str_replace($arc_problems_arr,$arc_problems_arr_replace, $v1_v);
                }
            }else{
                $temp[] = str_replace($arc_problems_arr,$arc_problems_arr_replace, $v1);
            }
            $arc_language_html_res[] = $temp;
        }
        return $arc_language_html_res;
    }

    public static function recogniseBaiduToHtmlFormatter($result){
        $one = '<div class="direct-chat-msg">
                    <div class="direct-chat-info clearfix">
                        <span class="direct-chat-name pull-

left">';
        $two = '</span>
                    </div>
                    <img class="direct-chat-img" 

src="/assets/public/images/avatar5.png" alt="message user image">
                    <div class="direct-chat-text">
                        ';
        $three = '
                    </div>';
        $mabe = '<div class="btn-group">
                  <button type="button" class="btn btn-box-tool 

dropdown-toggle" data-toggle="dropdown" aria-expanded="true">
                      <i class="fa fa-wrench"></i></button>
                      <div class="dropdown-menu " 

style="width:100%; min-width: max-content;padding:10px" 

role="menu">
                      ';
        $end = '</ul></div>
                </div>';
        $formatterResult = '';
        foreach ($result as $k=>$v){
            $formatterResult .= $one.$two;
            foreach ($v as $v_k=>$v_v){
                if($v_k===0){
                    $formatterResult .= $v_v.$three.$mabe;
                }else{
                    $formatterResult .= '<div class="direct-chat-

msg"><img class="direct-chat-img" 

src="/assets/public/images/avatar5.png" alt="message user 

image"><div class="direct-chat-text">'.$v_v.'</div></div>';
                }
            }
            $formatterResult .= $end.'点击查看可能识别的结果';
        }
        return $formatterResult;
    }

    /**
     * 拿到音频的时间长短
     * @param $file
     * @param int $base
     * @return float|int|string
     */
    public static function getWavLength($file, $base=10) {
        $fp = fopen($file, 'r');
        if (fread($fp,4) != 'RIFF') {
            return '';
        }
        fseek($fp, 20);
        $rawheader = fread($fp, 16);
        $header = unpack('vtype/vchannels/Vsamplerate/Vbytespersec/valignment/vbits',$rawheader);
        $pos = ftell($fp);
        while (fread($fp, 4) != 'data' && !feof($fp)) {
            $pos++;
            fseek($fp,$pos);
        }
        $rawheader = fread($fp, 4);
        $data = unpack('Vdatasize',$rawheader);
        $sec = $data['datasize'] / $header['bytespersec'];
        if($base==60) {
            $seconds = intval($sec % 60);
            $minutes = intval(($sec - $sec * 60) / 60);
            return $minutes.':'.$seconds;
        } else {
            return $sec;
        }
    }

    public static function httpcopy($url, $file="", $timeout=600) {
        $file = empty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file;
        $dir = pathinfo($file,PATHINFO_DIRNAME);
        !is_dir($dir) && @mkdir($dir,0755,true);
        $url = str_replace(" ","%20",$url);

        if(function_exists('curl_init')) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $temp = curl_exec($ch);
            if(@file_put_contents($file, $temp) && !curl_error($ch)) {
                return $file;
            } else {
                return false;
            }
        } else {
            $opts = array(
                "http"=>array(
                    "method"=>"GET",
                    "header"=>"",
                    "timeout"=>$timeout)
            );
            $context = stream_context_create($opts);
            if(@copy($url, $file, $context)) {
                //$http_response_header
                return $file;
            } else {
                return false;
            }
        }
    }

    /**
     * 检测字符串编码（注意：存在误判的可能性，降低误判的几率的唯一方式是给出尽可能多的样本$line）
     * 检测原理：对给定的字符串的每一个字节进行判断，如果误差与gb18030在指定误差内，则判定为gb18030；与utf-8在指定误差范围内，则判定为utf-8；否则判定为utf-16
     * @param string $line
     * @return string 中文字符集，返回gb18030（兼容gbk,gb2312,ascii）；西文字符集，返回utf-8（兼容ascii）；其他，返回utf-16（双字节unicode）
     * @author fangl
     */
    public static function detect_charset($line) {
        if(self::detect_gb18030($line)) {
            return 'gb18030';
        }
        else if(self::detect_utf8($line)) {
            return 'utf-8';
        }
        else return 'utf-16';
    }

    /**
     * 兼容ascii，gbk gb2312，识别字符串是否是gb18030标准的中文编码
     * @param string $line
     * @return boolean
     * @author fangl
     */
    public static  function detect_gb18030($line) {
        $gbbyte = 0; //识别出gb字节数
        for($i=0;$i+3<strlen($line);) {
            if(ord($line{$i}) >= 0 && ord($line{$i}) <= 0x7f) {
                $gbbyte ++; //识别一个单字节 ascii
                $i++;
            }
            else if( ord($line{$i}) >= 0x81 && ord($line{$i}) <= 0xfe &&
                (ord($line{$i+1}) >= 0x40 && ord($line{$i+1}) <= 0x7e ||
                    ord($line{$i+1}) >= 0x80 && ord($line{$i+1}) <= 0xfe) ) {
                $gbbyte += 2; //识别一个双字节gb18030（gbk）
                $i += 2;
            }
            else if( ord($line{$i}) >= 0x81 && ord($line{$i}) <= 0xfe &&
                ord($line{$i+2}) >= 0x81 && ord($line{$i+2}) <= 0xfe &&
                ord($line{$i+1}) >= 0x30 && ord($line{$i+1}) <= 0x39 &&
                ord($line{$i+3}) >= 0x30 && ord($line{$i+3}) <= 0x39) {
                $gbbyte += 4; //识别一个4字节gb18030（扩展）
                $i += 4;
            }
            else $i++; //未识别gb18030字节
        }
        return abs($gbbyte - strlen($line)) <= 4; //误差在4字节之内
    }

    /**
     * 识别字符串是否是utf-8编码，同样兼容ascii
     * @param string $line
     * @return boolean
     * @author fangl
     */
    public static function detect_utf8($line) {
        $utfbyte = 0; //识别出utf-8字节数
        for($i=0;$i+2<strlen($line);) {
            //单字节时，编码范围为：0x00 - 0x7f
            if(ord($line{$i}) >= 0 && ord($line{$i}) <= 0x7f) {
                $utfbyte ++; //识别一个单字节utf-8（ascii）
                $i++;
            }
            //双字节时，编码范围为：高字节 0xc0 - 0xcf 低字节 0x80 - 0xbf
            else if(ord($line{$i}) >= 0xc0 && ord($line{$i}) <= 0xcf
                && ord($line{$i+1}) >= 0x80 && ord($line{$i+1}) <= 0xbf) {
                $utfbyte += 2; //识别一个双字节utf-8
                $i += 2;
            }
            //三字节时，编码范围为：高字节 0xe0 - 0xef 中低字节 0x80 - 0xbf
            else if(ord($line{$i}) >= 0xe0 && ord($line{$i}) <= 0xef
                && ord($line{$i+1}) >= 0x80 && ord($line{$i+1}) <= 0xbf
                && ord($line{$i+2}) >= 0x80 && ord($line{$i+2}) <= 0xbf) {
                $utfbyte += 3; //识别一个三字节utf-8
                $i += 3;
            }
            else $i++; //未识别utf-8字节
        }
        return abs($utfbyte - strlen($line)) <= 3; //误差在3字节之内的，则识别为utf-8编码
    }

    public static function  getip() {
        $unknown = 'unknown';
        if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        /*
        处理多层代理的情况
        或者使用正则方式：$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
        */
        if (false !== strpos($ip, ','))
            $ip = reset(explode(',', $ip));
        return $ip;
    }

    public function  getips() {
        $unknown = 'unknown';
        if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        /*
        处理多层代理的情况
        或者使用正则方式：$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
        */
        if (false !== strpos($ip, ','))
            $ip = reset(explode(',', $ip));
        return $ip;
    }


}
